package datos;


public class MuestraClasificada<Clase> extends Muestra {
    private Atributo<Clase> clase;

    final public class RangoClasificado extends Muestra.Rango {
		public RangoClasificado(int comienzo, int fin) {
			super(comienzo, fin);		
		}    	
		
		@Override
		public MuestraClasificada<Clase> getMuestra()
		{
			return MuestraClasificada.this;
		}

        @Override
        public MuestraClasificada<Clase> getInside()
        {
            return new MuestraClasificada<Clase>(super.getInside(), clase);
        }

        @Override
        public MuestraClasificada<Clase> getOutside()
        {
            return new MuestraClasificada<Clase>(super.getOutside(), clase);
        }

        public Clase classOf(Dato d)
        {
            return MuestraClasificada.this.classOf(d);
        }
    }

    public MuestraClasificada(Muestra m, Atributo<Clase> clase) {
        super(m);

        if (!m.getAtributos().contains(clase)) {
            /* TODO later  */
            throw new RuntimeException("Esta muestra no tiene ese atributo");
        }

        this.clase = clase;
    }

    public Atributo<Clase> getClase() {
        return this.clase;
    }

    public Clase classOf(Dato d) {
        if (this.fitsDefinition(d)) {
            return d.getAtributo(clase);
        } else {
            throw new RuntimeException("Dato inconsistente");
        }
    }
}
